using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;

/// <summary>
/// 用于处理分辨率、窗口模式和图像质量设置的 UI 控制器
/// 适用于设置界面，支持自定义分辨率列表、质量预设，并可通过确认按钮应用设置
/// </summary>
public class ResolutionSetting_20240711 : MonoBehaviour
{
    [Header("UI 控件")]
    public Dropdown ResolutionDropdown; // 分辨率下拉菜单
    public Dropdown ModeDropdown; // 屏幕模式下拉菜单
    public Dropdown ImageQualityDropdown; // 图像质量下拉菜单
    public Button ConfirmBtn; // 确认按钮

    private Resolution[] reso; // 所有可用分辨率数组

    private List<Dropdown.OptionData> odList = new List<Dropdown.OptionData>(); // 分辨率下拉菜单的选项数据列表

    private List<Resolution> resolutionList = new List<Resolution>(); // 实际使用的分辨率列表

    private int resolutionWidth, resolutionHeight; // 当前选中的分辨率宽度和高度
    private bool screenBool; // 屏幕模式（全屏或窗口化）布尔值

    private bool confirmBool = false; // 是否需要确认分辨率修改的布尔值

    // 分辨率数据表（可自定义扩展）
    private int[,] resolutionData = new int[,] { { 720, 512, 60 }, { 1440, 1024, 60 }, { 2160, 1536, 144 } };

    // 显示的质量等级名称
    private List<string> qualityOptions = new List<string>() { "超低", "低", "中等", "高", "超高", "最高" };

    // 显示的模式名称
    private List<string> modeOptions = new List<string>() { "全屏", "窗口" };

    private void Awake()
    {
        InitDropdown(ModeDropdown, modeOptions);

        InitDropdown(ImageQualityDropdown, qualityOptions);
    }

    private void Start()
    {
        // 设置初始图像质量选项
        ImageQualityDropdown.value = QualitySettings.GetQualityLevel();

        //Debug.Log(QualitySettings.GetQualityLevel());

        InitResolution(); // 初始化分辨率设置
        InitScreen(); // 初始化屏幕模式设置
        SetDropdownValue(); // 设置下拉菜单的初始值

        ImageQualityDropdown.onValueChanged.AddListener(value =>
        {
            Colortransform(value); // 图像质量下拉菜单值改变时的回调函数
        });

        ConfirmBtn.onClick.AddListener(OnConfirmBtnClick); // 确认按钮点击时的回调函数
    }

    /// <summary>
    /// 初始化下拉菜单
    /// </summary>
    private void InitDropdown(Dropdown dropdown, List<string> options)
    {
        dropdown.ClearOptions();

        dropdown.AddOptions(options);
    }

    /// <summary>
    /// 初始化自定义分辨率列表并绑定下拉菜单
    /// </summary>
    private void InitResolution()
    {
        //reso = Screen.resolutions; // 获取所有可用分辨率
        //for (int i = 0; i < reso.Length; i++)
        //{
        //    if (i > 0)
        //    {
        //        if ((reso[i].width == reso[i - 1].width) && (reso[i].height == reso[i - 1].height))
        //        {
        //            // 如果当前分辨率与上一个分辨率相同，则跳过添加到分辨率列表的步骤
        //        }
        //        else
        //        {
        //            resolutionList.Add(reso[i]); // 将不同的分辨率添加到列表中
        //        }
        //    }

        //    Debug.Log("Width: " + reso[i].width + " Height: " + reso[i].height + " Refresh Rate: " + reso[i].refreshRate);
        //}

        for (int i = 0; i < resolutionData.GetLength(0); i++)
        {
            Resolution resolution = new Resolution();
            resolution.width = resolutionData[i, 0];
            resolution.height = resolutionData[i, 1];
            resolution.refreshRate = resolutionData[i, 2];
            resolutionList.Add(resolution);
            Debug.Log("Width: " + resolution.width + " Height: " + resolution.height + " Refresh Rate: " + resolution.refreshRate);
        }


        ResolutionDropdown.options.Clear(); // 清空分辨率下拉菜单选项

        for (int i = 0; i < resolutionList.Count; i++)
        {
            odList.Add(new Dropdown.OptionData()); // 创建下拉菜单的选项数据

            odList[i].text = ShowResolving(resolutionList[i]); // 设置选项显示的文本
            ResolutionDropdown.value = i; // 设置当前选中的分辨率选项

            ResolutionDropdown.options.Add(odList[i]); // 将选项数据添加到分辨率下拉菜单的选项列表中
        }

        ResolutionDropdown.onValueChanged.AddListener(index =>
        {
            ResolutionDropdown.captionText.text = ShowResolving(resolutionList[index]); // 设置分辨率下拉菜单显示的文本
            confirmBool = true; // 标记需要确认分辨率修改
            SetResolution(index); // 设置当前选中的分辨率
        });

        resolutionWidth = resolutionList[resolutionList.Count - 1].width; // 设置初始分辨率宽度为列表中最后一个分辨率的宽度
        resolutionHeight = resolutionList[resolutionList.Count - 1].height; // 设置初始分辨率高度为列表中最后一个分辨率的高度
    }

    /// <summary>
    /// 设置下拉菜单当前显示值
    /// </summary>
    private void SetDropdownValue()
    {
        if (Screen.fullScreen)
        {
            ModeDropdown.value = 0; // 设置屏幕模式为全屏
        }
        else
        {
            ModeDropdown.value = 1; // 设置屏幕模式为窗口化
        }

        for (int i = 0; i < resolutionList.Count; i++)
        {
            if (Screen.width == resolutionList[i].width && Screen.height == resolutionList[i].height)
            {
                ResolutionDropdown.value = i; // 设置分辨率下拉菜单为当前屏幕分辨率所在的选项
                return;
            }
        }
    }

    /// <summary>
    /// 确认应用分辨率和模式设置
    /// </summary>
    private void OnConfirmBtnClick()
    {
        if (confirmBool)
        {
            Screen.SetResolution(resolutionWidth, resolutionHeight, screenBool); // 根据选中的分辨率和屏幕模式设置屏幕分辨率
        }
    }

    /// <summary>
    /// 设置图像质量等级
    /// </summary>
    private void Colortransform(int value)
    {
        switch (value)
        {
            case 0:
                QualitySettings.SetQualityLevel(0, true); // 设置图像质量为最低
                break;
            case 1:
                QualitySettings.SetQualityLevel(1, true); // 设置图像质量为较低
                break;
            case 2:
                QualitySettings.SetQualityLevel(2, true); // 设置图像质量为中等
                break;
            case 3:
                QualitySettings.SetQualityLevel(3, true); // 设置图像质量为较高
                break;
            case 4:
                QualitySettings.SetQualityLevel(4, true); // 设置图像质量为最高
                break;
            case 5:
                QualitySettings.SetQualityLevel(5, true); // 设置图像质量为自定义
                break;
        }
    }

    /// <summary>
    /// 设置当前所选分辨率的宽高值
    /// </summary>
    private void SetResolution(int index)
    {
        resolutionWidth = resolutionList[index].width; // 设置选中分辨率的宽度
        resolutionHeight = resolutionList[index].height; // 设置选中分辨率的高度
    }

    /// <summary>
    /// 返回格式化的分辨率显示文字
    /// </summary>
    private string ShowResolving(Resolution res)
    {
        return res.width + "X" + res.height; // 返回分辨率的宽度和高度字符串
    }

    /// <summary>
    /// 初始化屏幕模式（全屏 / 窗口）下拉菜单
    /// </summary>
    private void InitScreen()
    {
        SetScreen(0); // 初始化屏幕模式为全屏
        ModeDropdown.onValueChanged.AddListener(index =>
        {
            confirmBool = true; // 标记需要确认分辨率修改
            SetScreen(index); // 设置屏幕模式
        });
    }

    /// <summary>
    /// 设置当前屏幕模式标记
    /// </summary>
    private void SetScreen(int index)
    {
        if (0 == index)
        {
            screenBool = true; // 设置屏幕模式为全屏
        }
        else
        {
            screenBool = false; // 设置屏幕模式为窗口化
        }
    }
}